package com.fatgirl.text
{
	import com.fatgirl.text.ITextStyle;
	import com.fatgirl.text.ITextStyleCfg;
	import com.fatgirl.text.TextStyle;
	
	import flash.filters.BitmapFilter;
	import flash.text.TextFormat;
	import flash.utils.getDefinitionByName;
	
	/**
	 *  
	 * 样式配置器
	 * 
	 * 例子：
	 * <?xml version="1.0" encoding="UTF-8"?>
<!-- 
	暂时开发接口为下：
	item 为样式 name ：样式名
		styles name = "TextField"
			pro为样式属性
				 alpha : Number 文本的 Alpha 透明度值  ，有效值为 0（完全透明）到 1（完全不透明）。默认值为 1
				 type:String 文本类型  动态显示类型："dynamic"，输入类型:"input";
				 multiline:Boolean (default = false) 是否多行显示 值(true,false)
				 wordWrap:Boolean(default = false) 是否自动换行 ，必须设置multiline = true 后 此属性生效
				 background:Boolean(default = false) 指定文本字段是否具有背景填充
				 backgroundColor:uint(default =  0xFFFFFF) 背景填充颜色  必须设置 background = true后此属性生效
				 border:Boolean(default = false) 是否有边框显示 
				 borderColor:uint(default = 0x000000) 边框颜色  必须设置border = true 后此属性生效
				 mouseEnabled:Boolean(default = true) 指定此对象是否接收鼠标或其他用户输入、消息
		styles name = "flash.text.TextFormat"  基本初始化
			pro为样式属性包含
				 font:String (default = null) — 以字符串形式表示的文本字体名称。  
				 size:int (default = null) — 一个指示大小（以像素为单位）的整数。  
				 color:uint (default = null) — 使用此文本格式的文本的颜色。包含三个 8 位 RGB 颜色成分的数字；例如，0xFF0000 为红色，0x00FF00 为绿色。  
				 bold:Boolean (default = null) — 一个布尔值，指示文本是否为粗体字。  
				 italic:Boolean (default = null) — 一个布尔值，指示文本是否为斜体。  
				 underline:Boolean (default = null) — 一个布尔值，指示文本是否带有下划线。  
				 url:String (default = null) — 使用此文本格式的文本超链接到的 URL。如果 url 为空字符串，则表示文本没有超链接。  
				 target:String (default = null) — 显示超链接的目标窗口。如果目标窗口为空字符串，则文本显示在默认目标窗口 _self 中
				 align:String (default = null) — 段落的对齐方式，居中对齐:"center",两端对齐:"justify",左对齐:"left",右对齐:"right" 
				 leftMargin:int (default = null) — 指示段落的左边距，以像素为单位。  
				 rightMargin:int (default = null) — 指示段落的右边距，以像素为单位。  
				 indent:int (default = null) — 一个整数，指示从左边距到段落中第一个字符的缩进。  
				 leading:int (default = null) — 一个数字，指示行与行之间的前导垂直间距量。   
		styles name ="flash.filters.GlowFilter" 发光滤镜
			pro 滤镜属性key 为名 ，value 为值
				 color:uint (default = 0xFF0000) — 光晕颜色，采用十六进制格式 0xRRGGBB。默认值为 0xFF0000。  
				 alpha:Number (default = 1.0) — 颜色的 Alpha 透明度值。有效值为 0 到 1。例如，.25 设置透明度值为 25%。  
				 blurX:Number (default = 6.0) — 水平模糊量。有效值为 0 到 255 建议为：2 的乘方值（如 2、4、8、16...）  
				 blurY:Number (default = 6.0) — 垂直模糊量。有效值为 0 到 255 建议值为：2 的乘方值（如 2、4、8、16..)
				 strength:Number (default = 2) — 印记或跨页的强度。该值越高，压印的颜色越深，而且发光与背景之间的对比度也越强。有效值为 0 到 255。  
				 inner:Boolean (default = false) — 指定发光是否为内侧发光。值 true 发光是内侧发光。值 false 外侧发光
				 knockout:Boolean (default = false) — 指定对象是否具有挖空效果。值为 true 将使对象的填充变为透明，并显示文档的背景颜色。 
		其他滤镜样式依次类推
		styles name = "flash.filters.BevelFilter"  斜角效果
 -->
<cfg>
	<item name="test0">
		<styles name="TextField">
			<pro key="border" value="true" type="Boolean" />
			<pro key="mouseEnabled" value="false" type="Boolean" />
			<pro key="sharpness" vaule="400" type="Number"/>
		</styles>
	</item>
	<item name="test1">
		<styles name="TextField">
			<pro key="border" value="false" type="Boolean" />
			<pro key="mouseEnabled" value="false" type="Boolean" />
			<pro key="type" value="dynamic" type="String" />
		</styles>
		<styles name="flash.text.TextFormat">
			<pro key="font" value="黑体" type="String" />
			<pro key="size" value="13" type="int" />
			<pro key="color" value="0xffffff" type="uint" />
			<pro key="bold" value="false" type="Boolean" />
			<pro key="italic" value="false" type="Boolean" />
			<pro key="url" value="http://www.baidu.com" type="String"/>
			<pro key="target" value="_blank" type="String" />
		</styles>
		<styles name="flash.filters.GlowFilter">
			<pro key="color" value="0x000000" type="uint" />
			<pro key="strength" value="3" type="Number" />
		</styles>
	</item>
	<item name="button">
		<styles name="TextField">
			<pro key="border" value="false" type="Boolean" />
			<pro key="mouseEnabled" value="false" type="Boolean" />
			<pro key="type" value="dynamic" type="String" />
		</styles>
		<styles name="flash.text.TextFormat">
			<pro key="font" value="黑体" type="String" />
			<pro key="size" value="13" type="int" />
			<pro key="color" value="0xffffff" type="uint" />
		</styles>
		<styles name="flash.filters.GlowFilter">
			<pro key="color" value="0x000000" type="uint" />
			<pro key="strength" value="3" type="Number" />
		</styles>
	</item>
</cfg>
	 * 
	 * @author iceman
	 * 
	 */
	public class TextStyleCfg implements ITextStyleCfg
	{
		private static var s_TextStyleCfg:TextStyleCfg;
		private var m_xml:XML;
		private var m_styleList:Array;
		public function TextStyleCfg()
		{
			m_styleList = new Array;
		}
		public static function getInstance():TextStyleCfg
		{
			if(!s_TextStyleCfg)
			{
				s_TextStyleCfg = new TextStyleCfg;
				
			}
			return s_TextStyleCfg;
		}
		/**
		 * 设置配置XML 
		 * @param _xml
		 * 
		 */
		public function setStyleXML(_xml:XML):void
		{
			m_xml = _xml;
		}
		
		/**
		 * 获取文本样式 
		 * @param _name
		 * @return 
		 * 
		 */
		public function getStyle(_name:String):ITextStyle
		{
			if(!m_styleList[_name])
			{
				var t_itemXml:XML = m_xml.item.(@name==_name)[0];
				if(!t_itemXml) throwError(this,FatError.VALUE_IS_NULL,"无法在XML中获取此文字样式配置："+_name);
				var t_TextStyle:TextStyle = new TextStyle;
				for(var i:int = 0;i<t_itemXml.styles.length();i++) parseXmlPro(t_itemXml.styles[i],t_TextStyle);
				m_styleList[_name] = t_TextStyle;
			}
			return m_styleList[_name];
		}
		private function parseXmlPro(_xml:XML,_TextStyle:TextStyle):void
		{
			var t_proXMLList:XMLList = _xml.pro;
			var t_name:String = _xml.@name;
			var t_filtersArr:Array;
			//判断是不是自身属性
			var t_proObj:Object;
			if(t_name == "TextField")
			{
				t_proObj =  new Array;
			}
			else
			{
				var t_ClassReference:Class = getDefinitionByName(t_name) as Class;
				if(!t_ClassReference)
				{
					throwError(this,FatError.VALUE_IS_NULL,t_name+"类路径不对，无法获取！");
				}
				t_proObj = new t_ClassReference;
			}
			//属性设置
			for(var i:int = 0 ;i<t_proXMLList.length();i++) switchTextFormat(t_proXMLList[i],t_proObj);
			if(t_proObj is TextFormat)
			{
				_TextStyle.setTextFormat(t_proObj as TextFormat);
			}
			else if(t_proObj is BitmapFilter)
			{
				t_filtersArr = _TextStyle.getTextFilters().concat(t_proObj);
				_TextStyle.setTextFilters(t_filtersArr);
			}
			else if(t_proObj is Array)
			{
				_TextStyle.setTextField(t_proObj as Array);
			}
			
			
		}
		private function switchTextFormat(_xml:XML,_proObj:Object):void
		{
			var t_proStr:String = String(_xml.@key);
			var t_obj:Object = _xml.@value;
			var t_type:String = String(_xml.@type);
			var t_proObj:Object = _proObj;
			switch(t_type)
			{
				case "int":
					t_proObj[t_proStr] = int(t_obj);
					break;
				case "uint":
					t_proObj[t_proStr] = uint(t_obj);
					break;
				case "String":
					t_proObj[t_proStr] = String(t_obj);
					break;
				case "Boolean":
					if(String(t_obj) == "false")
					{
						t_proObj[t_proStr] = false;
					}
					else
					{
						t_proObj[t_proStr] = true;
					}
					break;
				case "Number":
					t_proObj[t_proStr] = Number(t_obj);
					break;
			}
			//ftrace(this,t_proStr+":"+t_proObj[t_proStr]);
		}
	}
}